from sanic import Sanic, response
from sanic.request import Request


app = Sanic()

# 获取查询字符串的值
@app.route('/get_args/')
async def get_args(request):
    # 访问URL和返回值格式：
    # {
    #     "url": "http://127.0.0.1:8000/get_args/?name=rui&age=23",
    #     "args": {
    #         "name": [
    #             "rui"
    #         ],
    #         "age": [
    #             "23"
    #         ]
    #     },
    #     "query_string": "name=rui&age=23"
    # }
    return response.json({
        'url': request.url,
        'args': request.args,
        'query_string': request.query_string
    })


# 获取JSON格式数据
# methods关键字参数指定该视图函数支持的HTTP请求方法列表
@app.route('/get_json/', methods=['POST'])
async def get_json(request):
    # 前端传过来的JSON数据，可以通过Request对象的json属性获取
    return response.json({'result': request.json})


@app.route('/')
async def index(request):
    html = '''
<html>
<body>
    <form action="/get_file/", method="POST" enctype="multipart/form-data">
        <input type="file" name="file1"/>
        <input type="file" name="file2"/>
        <input type="text" name="title"/>
        <input type="submit" value="upload"/>
    </form>
</body>
</html>
    '''
    return response.html(html)


# 文件上传
@app.route('/get_file/', methods=['POST'])
async def get_file(request):
    # {
    #      'file1': [File(type='image/jpeg', body=b'xx', name='portfolio-01.jpg')],
    #      'file2': [File(type='image/jpeg', body=b'xx', name='portfolio-05.jpg')]
    #  }

    # request.files为类字典对象(RequestParameters对象），字典的键为HTML form标签中
    # 文件输入框的名字，值为File对象列表,File对象有
    # name(文件名),body(文件二进制数据)和type(文件类型)
    # 三个属性
    # from sanic.request import RequestParameters
    # 调用RequestParameters的get方法，获取键file1对应的值，列表中的第一个元素
    # 如果想要获取列表则调用getlist方法
    file = request.files.get('file1')
    file_properties = {
        '文件大小': len(file.body),
        '文件名': file.name,
        '文件类型': file.type
    }
    return response.json({
        # 需要转化为列表，否则抛异常
        # TypeError: dict_keys(['file1', 'file2']) is not JSON serializable
        'file_names': list(request.files.keys()),
        'file_properties': file_properties,
        'form': request.form, # request.form为RequestParameters对象，类字典: {"title":["美丽人生"]}
    }, ensure_ascii=False)

if __name__ == '__main__':
    app.run()
